package setting

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"errors"
	"os"
)

type Secret struct {
	PrivateKey *rsa.PrivateKey
	Enable     bool
}

func (cfg *Cfg) initRsaSecret() error {
	var privatePath = "./private_key.pem"
	cfg.Secret = Secret{Enable: false}
	if !fileExists(privatePath) {
		return nil
	}
	data, err := os.ReadFile(privatePath)
	if err != nil {
		return err
	}
	// 解析PEM格式的私钥
	block, _ := pem.Decode(data)
	if block == nil || block.Type != "RSA PRIVATE KEY" {
		return errors.New("failed to decode PEM block containing private key")
	}
	// 将私钥转换为rsa.PrivateKey类型
	parsedKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return err
	}
	cfg.Secret = Secret{PrivateKey: parsedKey, Enable: true}
	return nil
}
func (cfg *Cfg) DecryptedData(encryptedText string) string {
	// 未配置private_ke.pem 则返回原字符串
	if !cfg.Secret.Enable {
		return encryptedText
	}
	// base64解码前端传来的加密数据
	ciphertext, err := base64.StdEncoding.DecodeString(encryptedText)
	if err != nil {
		return ""
	}

	// 定义解密使用的填充模式，对于RSA通常使用PKCS#1 v1.5 Padding
	decryptedData, err := rsa.DecryptPKCS1v15(rand.Reader, cfg.Secret.PrivateKey, ciphertext)
	if err != nil {
		return ""
	}

	return string(decryptedData)
}
func fileExists(filePath string) bool {
	_, err := os.Stat(filePath)
	if err != nil {
		if os.IsNotExist(err) {
			return false
		}
		// 其他错误（比如权限问题），处理或忽略
	}
	return true
}
